package grafica;

import java.util.ArrayList;

import org.apache.axis2.AxisFault;

import exceptions.ConexionException;
import exceptions.LogicaException;
import exceptions.PersistenciaException;
import logica.Fachada;

public class ControladorPrincipal 
{
	private VentanaPrincipal ventanaPrincipal = null;
	private VentanaMensajes ventanaMensajes = null;
	private ArrayList<String> equiposActivos = null;
	
	public ControladorPrincipal (VentanaPrincipal ventana)
	{
		this.ventanaPrincipal = ventana;
		this.equiposActivos = new ArrayList<String>();
	}
	
	public void difundirEstoyActivo () throws PersistenciaException, LogicaException, AxisFault
	{
		/*
		 * 1. Difundo a travès de la fachada que estoy activo
		 */
		try {
			Fachada.getInstancia().difundirEstoyActivo();
		} catch (ConexionException e) {
			// TODO Auto-generated catch block
			ventanaPrincipal.mostrarError("Ocurrió un error grave: " + e.getMessage());
			System.exit(0);
		}
	}
	
	public void recibirEquiposActivos ()
	{
		/*
		 * Establezco un LOOP infinito que realiza las siguientes acciones:
		 * 1. Le pido a la fachada que reciba la dirección IP de un equipo activo
		 * 2. Si devolvió el String "ninguna", no hago nada
		 * 3. En otro caso, actualizo la lista de equipos activos de la VentanaPrincipal
		 *    con la dirección IP del equipo activo que fue recibida
		 */
		new Thread() {
			public void run() {
				while (true) {
					String equipoActivo;
					try {
						equipoActivo = Fachada.getInstancia().recibirEquipoActivo();
						System.out.println("Recibiendo equipo activo en el controlador: " + equipoActivo);
						if (!equipoActivo.equals("ninguna") && !equiposActivos.contains(equipoActivo)) {
							equiposActivos.add(equipoActivo);
							ventanaPrincipal.agregarEquipo(equipoActivo);
						}
					} catch (ConexionException e) {
						ventanaPrincipal.mostrarError("Ocurrió un error grave: " + e.getMessage());
						System.exit(0);
					} catch (Exception e) {
						ventanaPrincipal.mostrarError(e.getMessage());
					}
					
				}
			}
		}.start();
	}
	
	public void enviarMensaje (String mensaje, String ipEquipoSeleccionado) throws PersistenciaException, LogicaException, AxisFault
	{
		/*
		 * 1. Envío a través de la fachada el mensaje recibido al equipo seleccionado
		 */
		try {
			Fachada.getInstancia().enviarMensaje(mensaje, ipEquipoSeleccionado);
			mostrarVentanaMensajes();
			ventanaMensajes.agregarMensaje("Para :"+ipEquipoSeleccionado+": " + mensaje);
		} catch (ConexionException e) {
			ventanaPrincipal.mostrarError("Ocurrió un error grave: " + e.getMessage());
			System.exit(0);
		}
	}
	
	public void mostrarVentanaMensajes ()
	{
		if (ventanaMensajes == null){
			ventanaMensajes = new VentanaMensajes();
		}
	}
}
